package com.qf.FinancialManagement.controller;
import com.qf.FinancialManagement.domain.TmsStatementCc;
import com.qf.FinancialManagement.service.TmsStatementCcService;
import com.qf.common.core.controller.BaseController;
import com.qf.common.core.domain.AjaxResult;
import com.qf.common.core.page.TableDataInfo;
import com.qf.common.utils.poi.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * ---好运常在---
 *
 * @author ChengShuaiKe
 * @date 2025/9/2 0002
 * @desc
 */
@RequestMapping("/finance/settlement")

@RestController


public class TmsStatementCcController extends BaseController {
    @Autowired
    private TmsStatementCcService tmsStatementCcService;

    @GetMapping("/list")
    public TableDataInfo list(TmsStatementCc tmsStatementCc) {
        System.out.println("接收到的查询参数: " + tmsStatementCc.getSettlementStatus());

        startPage();
        List<TmsStatementCc> list = tmsStatementCcService.selectStatementList(tmsStatementCc);
        return getDataTable(list);
    }

    /**
     * 导出对账单列表（使用若依框架ExcelUtil正确方法）
     */
    @GetMapping("/export")
    public void export(TmsStatementCc tmsStatementCc, HttpServletResponse response) {
        try {
            System.out.println("=== 开始处理导出请求 ===");
            // 查询全部数据（忽略筛选条件）
            List<TmsStatementCc> list = tmsStatementCcService.selectStatementList(new TmsStatementCc());
            System.out.println("查询到的全部数据条数: " + (list != null ? list.size() : 0));

            if (list == null || list.isEmpty()) {
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("没有找到符合条件的数据");
                return;
            }

            // 关键修复：使用若依ExcelUtil的exportExcel方法（直接传入response）
            ExcelUtil<TmsStatementCc> util = new ExcelUtil<>(TmsStatementCc.class);
            util.exportExcel(response, list, "对账单数据"); // 框架自动处理响应头和文件流

        } catch (Exception e) {
            try {
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("导出失败: " + e.getMessage());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }


    /**
     * 导入模板下载
     */
    @GetMapping("/importTemplate")
    public AjaxResult importTemplate() {
        ExcelUtil<TmsStatementCc> util = new ExcelUtil<>(TmsStatementCc.class);
        return util.importTemplateExcel("对账单导入模板"); // 生成模板（含表头）
    }

    /**
     * 导入数据
     */
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
        ExcelUtil<TmsStatementCc> util = new ExcelUtil<>(TmsStatementCc.class);
        List<TmsStatementCc> statementList = util.importExcel(file.getInputStream()); // 解析Excel为实体列表

        // 添加数据校验逻辑
        Iterator<TmsStatementCc> iterator = statementList.iterator();
        int rowNum = 1; // Excel行号（从标题行后开始计算）

        while (iterator.hasNext()) {
            TmsStatementCc statement = iterator.next();
            rowNum++;

            Date currentDate = new Date();
            statement.setCreateTime(currentDate);
            statement.setUpdateTime(currentDate);


            // 修复：仅当Excel未提供创建时间时，才设置为当前时间
            if (statement.getUpdateTime() == null) {
                statement.setUpdateTime(currentDate);
            }
            // 更新时间始终设为当前时间（无论Excel是否提供）
            statement.setUpdateTime(currentDate);

            // 检查必填字段
            if (statement.getStatementNo() == null || statement.getStatementNo().trim().isEmpty()) {
                return AjaxResult.error("第" + rowNum + "行数据校验失败：对账单号不能为空");
            }
            if (statement.getCustomer() == null || statement.getCustomer().trim().isEmpty()) {
                return AjaxResult.error("第" + rowNum + "行数据校验失败：客户信息不能为空");
            }

            // 修复：为非空字段添加默认值
            if (statement.getTotalVolume() == null) {
                statement.setTotalVolume(BigDecimal.ZERO); // BigDecimal类型使用BigDecimal.ZERO
            }
            if (statement.getTotalWeight() == null) {
                statement.setTotalWeight(BigDecimal.ZERO); // BigDecimal类型使用BigDecimal.ZERO
            }
            if (statement.getGoodsQuantity() == null) {
                statement.setGoodsQuantity(0L); // Long类型使用0L（显式指定long类型）
            }
            if (statement.getTotalOrders() == null) {
                statement.setTotalOrders(0L); // Long类型使用0L（显式指定long类型）
            }
            // 修复：为应收总金额添加默认值（解决Column 'receivable_amount' cannot be null错误）
            if (statement.getReceivableAmount() == null) {
                statement.setReceivableAmount(BigDecimal.ZERO); // BigDecimal类型使用BigDecimal.ZERO
            }

        }

        String message = tmsStatementCcService.importStatementList(statementList, updateSupport);
        return AjaxResult.success(message); // 返回导入结果
    }
}